package reflect;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * 使用反射调用方法
 * 无参方法
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Person p =new Person();//实例化对象
        p.sayHello();//调用该对象的方法


        //1实例化对象
        Class cls = Class.forName("reflect.Person");
        //newInstance()使用此方法可以有效地绕过编译器否则会执行的编译时异常检查
        Object o = cls.newInstance();//反射

        //2调用o的sayHello方法
        //2.1通过Class获取Person的sayHello方法
        /** getMethod():获取方法 */
        Method method = cls.getMethod("sayHello");
        //2.2调用o的方法
        /** invoke():调用 */
        method.invoke(o);//[o.sayHello()] -> method(此获取了当前方法) ->通过-> .invoke开始调用(o的)方法


        Scanner scan = new Scanner(System.in);
        System.out.println("请输入类名:");
        String className = scan.nextLine();
        System.out.println("请输入方法名:");
        String methodName = scan.nextLine();
        Class cla = Class.forName(className);//类名
        Object oj = cla.newInstance();//反射
        Method methods = cla.getMethod(methodName);//方法名
        methods.invoke(oj);//某方法.调用(某类):->的方法





    }
}
